package com.wn;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import com.netflix.loadbalancer.RoundRobinRule;
import feign.Logger;
import feign.Retryer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/**
 * @author yellow Docter
 * @date 2022 -10-24
 * @desc
 */
//@EnableHystrix
@EnableCircuitBreaker
//@EnableEurekaClient  //服务注册和发现
@EnableDiscoveryClient
@SpringBootApplication
@EnableFeignClients  //开启openfeign 的使用
public class PortalServiceApplication {

//    Collection collection;
    // 实现了接口:有迭代器的方法 Iterator<T> iterator();

    //List的实现 ArrayList
    //    public Iterator<E> iterator() {
    //        return new ArrayList.Itr();
    //    }

    public static void main(String[] args) {
        SpringApplication.run(PortalServiceApplication.class,args);
    }

    /**
     *
     * @return
     *  1、@Bean 只能用在 方法上面
     *  2、调用方法,把方法的返回值注入到ioc容器中
     *  3、ioc容器中 id的名称是:默认是方法的名称
     */
    @Bean
    @LoadBalanced // 负载均衡的注解
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }


    /**
     *  RestTemplate 访问 服务可以配置 负载均衡策略
     *  IRule 规则：
     *    1、RandomRule       随机规则
     *    2、RoundRobinRule   轮训规则(默认负载均衡策略)
     * @return
     */
    @Bean
    public IRule rules(){
        return new RandomRule();
    }

    // 配置 openfeign的日志输出级别
    // 方便查看调用关系  http的细节
    @Bean
    public Logger.Level loggerLevel(){
        return Logger.Level.FULL;
    }

    // openfeign 调用失败 可以配置重试机制
    @Bean
    public Retryer feignRetryer() {
        return new Retryer.Default();
    }

}
